package cm.com.carlamanda.util;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringUtil {
    static Random r = new Random();
    /** 大写数字 */
    private static final String[] NUMBERS = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
    /** 整数部分的单位 */
    private static final String[] IUNIT = { "", "十", "百", "千", "万", "十", "百", "百", "亿", "十", "百", "千", "万", "十", "百",
            "千" };
    /** 小数部分的单位 */
    private static final String[] DUNIT = { "角", "分", "厘" };

    /**
     * 得到大写金额
     * */
    public static String toChinese(String str) {
        str = str.replaceAll(",", "");// 去掉","
        String integerStr; // 整数部分数字
        String decimalStr; // 小数部分数字

        // 初始化：分离整数部分和小数部分
        if (str.indexOf(".") > 0) {
            integerStr = str.substring(0, str.indexOf("."));
            decimalStr = str.substring(str.indexOf("."));
        } else if (str.indexOf(".") == 0) {
            integerStr = str;
            decimalStr = str.substring(1);
        } else {
            integerStr = str;
            decimalStr = "";
        }
        // integerStr 去掉首0，不比去掉decimalStr的尾0(超出部分舍去)
        if (!integerStr.equals("")) {
            integerStr = Long.toString(Long.parseLong(integerStr));
            if (integerStr.equals("0")) {
                integerStr = "";
            }
        }

        // overflow超出处理能力，直接返回
        if (integerStr.length() > IUNIT.length) {
            System.out.println(str + ": 超出处理能力");
            return str;
        }

        int[] integers = toArray(integerStr);// 整数部分数字
        boolean isMust5 = isMust5(integerStr); // 设置万单位
        int[] decimals = toArray(decimalStr); // 小数部分数字
        return getChineseInteger(integers, isMust5) + getChineseDecimal(decimals);
    }

    /**
     * 整数部分和小数部分转换为数组，从高位到至低位
     * */
    private static int[] toArray(String number) {
        int[] array = new int[number.length()];
        for (int i = 0; i < number.length(); i++) {
            array[i] = Integer.parseInt(number.substring(i, i + 1));
        }
        return array;
    }

    /**
     * 得到中文金额的整数部分
     * */
    private static String getChineseInteger(int[] integers, boolean isMust5) {
        StringBuffer chineseInteger = new StringBuffer("");
        int length = integers.length;
        for (int i = 0; i < length; i++) {
            // 0出现在关键位置：1234（万）5678（亿）9012（万）3456（元）
            // 特殊情况： 10（拾元、壹拾元、壹拾万元、拾万元）
            String key = "";
            if (integers[i] == 0) {
                if ((length - i) == 13) // 万（亿）（必填）
                    key = IUNIT[4];
                else if ((length - i) == 9)// 亿（必填）
                    key = IUNIT[8];
                else if ((length - i) == 5 && isMust5)// 万（不必填）
                    key = IUNIT[4];
                else if ((length - i) == 1)// 元（必填）
                    key = IUNIT[0];
                // 0遇非0时补零，不包含最后一位
                if ((length - i) > 1 && integers[i + 1] != 0)
                    key += NUMBERS[0];
            }
            chineseInteger.append(integers[i] == 0 ? key : (NUMBERS[integers[i]] + IUNIT[length - i - 1]));
        }
        return chineseInteger.toString();
    }

    /** 得到中文金额的小数部分 */
    private static String getChineseDecimal(int[] decimals) {
        StringBuffer chineseDecimal = new StringBuffer("");
        for (int i = 0; i < decimals.length; i++) {
            // 舍去3位小数之后的
            if (i == 3)
                break;
            chineseDecimal.append(decimals[i] == 0 ? "" : (NUMBERS[decimals[i]] + DUNIT[i]));
        }
        return chineseDecimal.toString();
    }

    /**
     * 判断第5位数字的单位“万”是否应加
     * */
    private static boolean isMust5(String integerStr) {
        int length = integerStr.length();
        if (length > 4) {
            String subInteger = "";
            if (length > 8) {
                // 取得从低位数，第5位到第8位的字串
                subInteger = integerStr.substring(length - 8, length - 4);
            } else {
                subInteger = integerStr.substring(0, length - 4);
            }
            return Integer.parseInt(subInteger) > 0;
        } else {
            return false;
        }
    }

    /**
     * 根据分隔符，返回字符串数组
     * 
     * @param srcStr
     *            源字符串
     * @param delimiters
     *            分隔符
     * @return 字符串数组
     * */
    public static String[] getStrArraysBySpit(String srcStr, String delimiters) {
        String[] result = null;
        int index = 0;
        if (srcStr != null) {
            StringTokenizer stk = new StringTokenizer(srcStr, delimiters);

            if (stk.hasMoreTokens())
                result = new String[stk.countTokens()];
            while (stk.hasMoreTokens()) {
                result[index] = stk.nextToken();
                index++;
            }
        }
        return result;

    }

    /**
     * 替换字符串
     *
     * @param line
     *            ---原字符串
     * @param oldString
     *            需要替换的字符串
     * @param newString
     *            替换进去的字符串
     * @return string
     * */
    public static final String replace(String line, String oldString, String newString) {
        if (line == null) {
            return null;
        }
        int i = 0;
        i = line.indexOf(oldString, i);
        if (i >= 0) {
            char[] line2 = line.toCharArray();
            char[] newString2 = newString.toCharArray();
            int oLength = oldString.length();
            StringBuffer buf = new StringBuffer(line2.length);
            buf.append(line2, 0, i).append(newString2);
            i += oLength;
            int j = i;
            while ((i = line.indexOf(oldString, i)) > 0) {
                buf.append(line2, j, i - j).append(newString2);
                i += oLength;
                j = i;
            }
            buf.append(line2, j, line2.length - j);
            return buf.toString();
        }
        return line;
    }

    /**
     * 添加引号
     *
     * @param str
     * @return
     * */
    public static String quoteString(String str) {
        return "'" + str + "'";
    }

    public static List<String> regexString(String orgn, String regEx) {
        List<String> result = new ArrayList<String>();
        Pattern pat = Pattern.compile(regEx);
        Matcher mat = pat.matcher(orgn);
        boolean rs = mat.find();
        for (int i = 1; i <= mat.groupCount(); i++) {
            String a = mat.group(i);
            System.out.println(a);
        }
        return result;
    }

    public static boolean isEmpty(String str) {
        if (str == null)
            return true;
        str = str.trim();
        if ("".equals(str) || str.length() == 0)
            return true;
        return false;
    }
    public static boolean isNotEmpty(String str) {
        if (str == null)
            return false;
        str = str.trim();
        if ("".equals(str) || str.length() == 0)
            return false;
        return true;
    }
}
